/**
 * TODO木子鱼系统平台<br/>
 * com.thh.sysnlock.lock<br/>
 * SellTicket.java<br/>
 *  创建人:mofeng <br/>
 * 时间：2019年1月14日-下午4:39:43 <br/>
 * 2019木子鱼公司-版权所有<br/>
 */
package com.thh.sysnlock.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 *
 * 模拟多线程环境下资源竞争的问题
 * SellTicket<br/>
 * 创建人:mofeng<br/>
 * 时间：2019年1月14日-下午4:39:43 <br/>
 * @version 1.0.0<br/>
 *
 */
public class SellTicket_Lock implements Runnable{

	//定义锁
	private Lock lock = new ReentrantLock();
	//票数
	private int ticket = 100;


//Lock是一个接口，里面的方法有：
//- lock()  获取锁，如果锁被暂用则一直等待
//- tryLock()   如果获取锁的时候，锁被占用就返回false,否则返回true
//- tryLock(long time, TimeUnit unit)   如果获取锁的时候，锁被占用就返回false,否则返回true 并且释放时间
//- unLock() :释放锁
//- lockInterruptibly();   用该锁的获得方式，如果线程在获取锁的阶段进入等待，那么可以中断次线程，先去做别的事情。


	@Override
	public void run() {
		while(ticket > 0 ) {
			lock.lock();//加锁 阻塞
			try {
				if(ticket > 0 ) {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"正在出售第："+ticket--+"张票!");
				}

			} finally {
				lock.unlock();//一定要释放锁
			}
		}
	}
}
